"""
降维算法中的“降维”，值得是降低特征矩阵中特征的数量。

from sklearn.decomposition import PCA   # 主成分分析
from sklearn.decomposition import IncrementalPCA    # 增量主成分分析
from sklearn.decomposition import KernelPCA # 核主成分分析
from sklearn.decomposition import MiniBatchSparsePCA    # 小批量系数主成分分析
from sklearn.decomposition import SparsePCA # 系数主成分分析
from sklearn.decomposition import TruncatedSVD  # 阶段的SVD

from sklearn.decomposition import FactorAnalysis    # 因子分析

from sklearn.decomposition import FastICA   # 独立成分分析的快速算法

from sklearn.decomposition import DictionaryLearning    # 字典学习
from sklearn.decomposition import MiniBatchDictionaryLearning    # 小批量字典学习
from sklearn.decomposition import dict_learning     # 字典学习用于矩阵分解
from sklearn.decomposition import dict_learning_online     # 在线字典学习用于矩阵分解

# 高级矩阵分解
from sklearn.decomposition import LatentDirichletAllocation     # 具有在线变分贝叶斯算法的隐含狄利克雷分布
from sklearn.decomposition import NMF       # 非负矩阵分解

from sklearn.decomposition import SparseCoder       # 系数编码

PCA
PCA使用的信息量衡量指标是样本方差，又称为可解释性方差。
方差越大，特征所带的信息量越多。

方差计算公式中为什么出书是n-1
这是为了得到样本方差的无偏估计。（需进一步找答案）

1. 元数据结构（m,n），找出原本的n个特征向量构成的n维空间
2. 决定降维后的特征数量：k
3. 通过某种变化，找出n个新的特征向量，以及它们构成的新n维空间
找出n个新特征向量，让数据能够被压缩到少数特征上并且总信息量不损失太多的技术叫矩阵分解
4. 找出原始数据在新特征空间v中的n个新特征向量上对应的值,即“将数据映射到新空间中”
5. 选取前k个信息量最大的特征，删掉没有选中的特征，成功将n维空间v降维k维

PCA 主成分分析
SVD 奇异值分解

PCA和SVD是两种不同的降维算法，但他们都遵从上面的过程进行降维，只是两种算法使用的矩阵分解方法不同，信息量的衡量指标不同。
PCA使用方差作为信息量的衡量指标，并且特征值分解来找出空间V。SVD使用奇异值分解来找出空间V。

特征选择和降维
"""

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

# n_components  降维后需要保留的特征数
# 通常为了可视化，n_components=2
iris=load_iris()
y=iris.target
x=iris.data
# print(x.shape)   # (150,4)
pca=PCA(n_components=2)
pca=pca.fit(x)
print(pca.explained_variance_ratio_)    # 降维后每个新特征向量所占的信息量占原始数据总信息量的百分比
print(pca.explained_variance_)  # 降维后每个特征向量上所带信息量的大小

x_dr=pca.transform(x)

# plt.figure()
# colors=['red','black','orange']
# for i in [0,1,2]:
#     plt.scatter(x_dr[y==i,0],x_dr[y==i,1],c=colors[i],alpha=0.7,label=iris.target_names[i])
# plt.legend()
# plt.title("PCA of iris dataset")
# plt.show()

import numpy as np
pca=PCA()
pca=pca.fit(x)
print(pca.explained_variance_ratio_)
plt.figure()
plt.xticks([1,2,3,4])
plt.plot([1,2,3,4],np.cumsum(pca.explained_variance_ratio_),c='red',alpha=0.7)
plt.title("explained_variance_ratio_")
plt.show()